Soru & Cevap

PAYLAŞIM - MILLIS kullanarak Çoklu Görev (MultiTasking)

21.07.2018 - 11:16

ARDUINO programlarında birden fazla işlemi değişik zamanlayıcı kontrolleri altında yapabilmek için aşağıdaki uygulamayı sunuyorum. Umarım yardımcı olur.

Örnekte 3 değişik işlem değişik zaman ayarları ile programlanmıştır. Daha fazlası gerektiğinde aynı yöntem kullanılarak arttırılabilir.

Her işlem için iki değişken tanımlanması gerekir:

unsigned long ISR1_Zaman = 5000;  //ms

unsigned long ISR1_evvelkiMILLIS = 0;

ISRnZaman işlemlerin hangi süre ayarı ile gerçekleşmesi gerektiğini ayarlar. Yukarıdaki örnek ayar işlemin her 5 saniyede bir yapılacağını tanımlar.

ISR1_evvelkiMILLIS ise işlemler arası geçen zamanı kontrolde kullanılır.

Bu ayarlardan sonra, LOOP() içinde her işlemin zaman ayarı kontrol edilerek gereken rutin çalıştırılır.

MILLIS() fonksiyonu ARDUINO programı çalışmaya başladığından beri geçen zamanı döndürür. Bu değişkeni arzuladığımız işlemimizin zaman ayarına karşılaştırarak işlemin yapılması gereken zamanı tespit etmiş oluruz.

Bu tekniğin en önemli kısmı ARDUINO nun DELAY() fonksiyonunun kullanılmamasıdır.

DELAY() kumandası çalışırken ARDUINO programındaki başka bütün işlemler çalışmaz. Bundan dolayı birden fazla işlem kontrolü gerektiğinde DELAY() kullanmak doğru değildir.

DELAY yerine MILLIS() fonksiyonunu kullanarak programı durdurmadan istediğimiz kadar işlemi 'gerçek zaman' da çalıştırabiliriz.

İyi Çalışmalar.

ÖRNEK: 
Program 3 tane işlem tanımlar. 

Her 5 saniyede ekrana bir mesaj yaz.
Her 1 saniyede LED13 ü yak.
LED13 ü 3 saniye yandıktan sonra söndür.

Programın çalışmasını takip için #1 deki MESAJ haricinde öteki işlemler de seri monitöre mesajlar yollamaktadırlar.
ARDUINO LED13 ü izlediğinizde, her 1 saniyede yandığını ve 3 saniye yanık kaldıktan sonra söndüğünü göreceksiniz.
Ayrıca her 5 saniyede seri monitöre 

****** ZAMANLAYICI_1: Message @ nnnn

yazılacaktır.

// MILLIS kullanarak Çoklu Görev (MultiTasking)
 
const int LEDPin= 13; //LED13 kullan
 
//GÖREV değişkenleri

unsigned long ISR1_Zaman = 5000;  //ms
unsigned long ISR2_Zaman = 1000;  //ms
unsigned long ISR3_Zaman = 3000;  //ms

unsigned long ISR1_evvelkiMILLIS = 0;
unsigned long ISR2_evvelkiMILLIS = 0;
unsigned long ISR3_evvelkiMILLIS = 0;
 
void setup() {
  Serial.begin(115200);     //Seri Monitör hız ayarı
  pinMode(LEDPin, OUTPUT);  //LED13 ü çıkış olarak ayarla
 
}
 
void loop() {

  unsigned long currentMillis = millis(); // zamanlayıcıyı oku
  
  //ZAMANI gelen işi yap:
 
  // ----- TASK#1: 
  if (currentMillis - ISR1_evvelkiMILLIS >= ISR1_Zaman) 
  {
    ISR1_evvelkiMILLIS = currentMillis;
    ISR_1();
  }
 
  // ----- TASK#2: 
  if (currentMillis - ISR2_evvelkiMILLIS >= ISR2_Zaman) 
  {
    ISR2_evvelkiMILLIS = currentMillis;
    ISR_2();
  }
  
  // ----- TASK#3: 
  if (currentMillis - ISR3_evvelkiMILLIS >= ISR3_Zaman) 
  {
    ISR3_evvelkiMILLIS = currentMillis;
    ISR_3();
  }
 
}
 
 
void ISR_1() {
  // Seri monitöre mesaj yazdır
  Serial.print("****** ZAMANLAYICI_1: Message @ "); 
  Serial.println(ISR1_evvelkiMILLIS);

}
 
void ISR_2() {
  // LED13 ü yak
  LEDon(); 
  Serial.print("DIAGS - ZAMANLAYICI_2: LEDon @ "); 
  Serial.println(ISR2_evvelkiMILLIS);

}

void ISR_3() {
  // LED 13ü söndür
  Serial.print("DIAGS - ZAMANLAYICI_3: LEDoff @ "); 
  Serial.println(ISR3_evvelkiMILLIS);
  LEDoff();
  
}
 
void LEDon() {
  digitalWrite (LEDPin, HIGH);
}
 
void LEDoff() {
  digitalWrite (LEDPin, LOW);
}

 

1,548 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-158072-1530701953.jpg
TGUNEYSU
30.11.2020 - 11:20

@egitim meikar

Kodunuzu paylaşmışsanız ulaşamadım.

ePostama yollayın bakayım: tguneysu at msn nokta com

eğitim meikar
30.11.2020 - 12:03
turgut bey mail olarak sizlere iletmiş durumdayım allah razı olsun şimdiden
picture-315981-1606720906.png
egitim.medikar
30.11.2020 - 10:28

Turgut Bey,

Öncelikle yazmış olduğunuz bilgileri okudum çok güzel bilgiler paylaşmışşınız. Şimdi ben bir kodlama üzerinde çalışıyorum. Elimde bir adet arduino nano kart var bu kart üzerine 1 adet sd kart modülü 3 adet buton ve bir adet motor sürücü devrem var. RC araba için kullanacağım bu kartta kumandadan gelen sinyalleri baz alarak uygun ses dosyasını çalmasını butonlara basıldığında motor sürücünün hareket etmesini ve diğer butonla bağlamış olduğum ledleri yakmasını istiyorum. Kodlar tek başına çalıştığında işlem yapılmakta ancak birlikte hiç biri çalışmamaktadır. Acaba kodu sizinle paylaşşam yardımcı olma durumunuz olurmu?

eğitim meikar
30.11.2020 - 10:39
k#include #include #include #define SD_ChipSelectPin 10 TMRpcm tmrpcm; int eski_durum=0; int yeni_durum=0; int simdi_cal=0
picture-87289-1569234090.png
yakupgovler
28.09.2019 - 12:41

Delay kullanımı nedeniyle ortaya çıkan problemlere çok güzel bir çözüm sunmuşsunuz. Kendi adıma teşekkür ederim.

Arduino'da normalde multitasking yok, ancak millis gibi bir fonksiyonu verdiğiniz güzel algoritmaya ile kullanıp, neredeyse eş zamanlı farklı işlemleri yapmak için kullanabiliriz.